#pragma once

#include <unistd.h>
#include "Log.h"

namespace zmh
{
    class Auto_Popen
    {
    public:
        Auto_Popen(std::string cmd, std::string mode)
        {
            file = popen(cmd.c_str(), mode.c_str());
        }
        ~Auto_Popen()
        {
            if (file)
                pclose(file);
        }
        operator FILE *() // 支持Auto_Popen -> FILE* 的隐式类型转换
        {
            return file;
        }

    private:
        FILE *file;
    };

    class Telecontrol
    {
    public:
        std::string Excute(std::string cmd) const
        {
            // 执行cmd命令
            Auto_Popen file(cmd.c_str(), "r");
            if (file == nullptr)
            {
                LOG(zmh::FATAL) << "file=" << file << ",popen mistake:" << strerror(errno);
                return "远端服务器出现错误(popen mistake)";
            }
            // 通过file获取运行结果
            std::string result;
            while (true)
            {
                char buffer[1024];
                int n = fread(buffer, 1, sizeof(buffer) - 1, file);
                buffer[n] = 0;
                result += buffer;
                if (n < sizeof(buffer) - 1) // 读取完毕
                    break;
            }
            result += "Excute sucess";
            // 返回result
            return result;
        }
    };
}

// 太坑了,fread返回值是读到的元素个数sizeof(buffer) - 1
// 最简单的一种实现方式,不用手动fork exce
// popen 的问题很多
